import { NavigateFunction } from "react-router-dom";
import authService from "../services/auth";
import { RouteConfig, Role, Permission } from "./types";

/**
 * 路由守卫工具函数集合
 */

/**
 * 检查用户是否已认证
 * @returns boolean 认证状态
 */
export function checkIsAuthenticated(): boolean {
  return authService.getIsAuthenticated();
}

/**
 * 检查用户是否拥有指定角色
 * @param role 所需角色或角色列表
 * @returns boolean 用户是否有角色
 */
export function checkHasRole(role: Role | Role[]): boolean {
  return authService.hasRole(role);
}

/**
 * 检查用户是否拥有指定权限
 * @param permission 所需权限或权限列表
 * @returns boolean 用户是否有权限
 */
export function checkHasPermission(permission: Permission): boolean {
  return authService.hasPermission(permission);
}

/**
 * 检查用户是否可以访问路由
 * @param route 路由配置
 * @returns boolean 用户是否可以访问
 */
export function checkCanAccessRoute(route: RouteConfig): boolean {
  if (!route.meta) return true;

  // 检查是否需要认证
  if (route.meta.requiresAuth && !checkIsAuthenticated()) {
    return false;
  }

  // 检查角色
  if (route.meta.roles && route.meta.roles.length > 0) {
    if (!checkHasRole(route.meta.roles)) {
      return false;
    }
  }

  // 检查权限
  if (route.meta.permissions && route.meta.permissions.length > 0) {
    if (!checkHasPermission(route.meta.permissions)) {
      return false;
    }
  }

  return true;
}

/**
 * 鉴权失败时的重定向处理
 * @param route 当前路由
 * @param navigate 导航函数
 */
export function handleAuthFailure(
  route: RouteConfig,
  navigate: NavigateFunction
): void {
  if (!checkIsAuthenticated()) {
    // 未登录，重定向到登录页
    navigate("/login", {
      replace: true,
      state: { from: route.path },
    });
  } else {
    // 已登录但权限不足，重定向到无权限页面
    navigate("/unauthorized", { replace: true });
  }
}

/**
 * 递归过滤有权限访问的路由
 * @param routes 路由配置数组
 * @returns 过滤后的路由配置数组
 */
export function filterAuthorizedRoutes(routes: RouteConfig[]): RouteConfig[] {
  return routes
    .filter((route) => checkCanAccessRoute(route))
    .map((route) => {
      if (route.children) {
        return {
          ...route,
          children: filterAuthorizedRoutes(route.children),
        };
      }
      return route;
    });
}

/**
 * 根据路径查找对应的路由配置
 * @param routes 路由配置数组
 * @param path 路径
 */
export function findRouteByPath(
  routes: RouteConfig[],
  path: string
): RouteConfig | undefined {
  for (const route of routes) {
    // 检查当前路由
    const routePath = route.path === "" ? "/" : route.path;
    const fullPath = routePath.startsWith("/") ? routePath : `/${routePath}`;

    if (fullPath === path) {
      return route;
    }

    // 递归检查子路由
    if (route.children) {
      const result = findRouteByPath(route.children, path);
      if (result) {
        return result;
      }
    }
  }

  return undefined;
}
